
        <html>
			<head>
			     <title>Xcode编译器里有鬼 – XcodeGhost样本分析 - 蒸米</title>
				 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
			</head>
			<body>
				<h1>原文地址:<a href="http://drops.wooyun.org/news/8864">http://drops.wooyun.org/news/8864</a></h1>
				
      <p>
        <p>作者： 蒸米，迅迪 @阿里移动安全</p>

<h1>0x00 序</h1>

<hr />

<p><a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="e0045a6b066365077a64085557057b4006784fa0057470055747">[email&#160;protected]</a><script data-cfhash='f9e31' type="text/javascript">/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */</script>_boy在微博上发了一条微博说到：一个朋友告诉我他们通过在非官方渠道下载的 Xcode 编译出来的 app 被注入了第三方的代码，会向一个网站上传数据，目前已知两个知名的 App 被注入。</p>

<p><img src="http://static.wooyun.org//drops/20150917/2015091709411353341.jpg" alt="enter image description here" /></p>

<p>随后很多留言的小伙伴们纷纷表示中招，@谁敢乱说话表示：”还是不能相信迅雷，我是把官网上的下载URL复制到迅雷里下载的，还是中招了。我说一下：有问题的Xcode6.4.dmg的sha1是：<code>a836d8fa0fce198e061b7b38b826178b44c053a8</code>，官方正确的是：<code>672e3dcb7727fc6db071e5a8528b70aa03900bb0</code>，大家一定要校验。”另外还有一位小伙伴表示他是在百度网盘上下载的，也中招了。</p>

<!--more-->

<h1>0x01 样本分析</h1>

<hr />

<p><a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="d1344d799136477e365a46">[email&#160;protected]</a><script data-cfhash='f9e31' type="text/javascript">/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */</script> @longye的帮助下，@JoeyBlue_ 为我们提供了病毒样本:<code>CoreService</code>库文件，因为用带这个库的Xcode编译出的app都会中毒，所以我们给这个样本起名为：<code>XCodeGhost</code>。<code>CoreService</code>是在”<code>/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/Library/Frameworks/CoreServices.framework/</code>”目录下发现的，这个样本的基本信息如下：</p>

<pre><code>#!bash
$shasum CoreService
f2961eda0a224c955fe8040340ad76ba55909ad5  CoreService

$file CoreService
CoreService: Mach-O universal binary with 5 architectures
CoreService (for architecture i386):    Mach-O object i386
CoreService (for architecture x86_64):  Mach-O 64-bit object x86_64
CoreService (for architecture armv7):   Mach-O object arm
CoreService (for architecture armv7s):  Mach-O object arm
CoreService (for architecture arm64):   Mach-O 64-bit object
</code></pre>

<p>用ida打开，发现样本非常简单，只有少量函数。主要的功能就是先收集一些iPhone和app的基本信息，包括：时间，bundle id(包名)，应用名称，系统版本，语言，国家等。如图所示：</p>

<p><img src="http://static.wooyun.org//drops/20150917/2015091709411390450.jpg" alt="enter image description here" /></p>

<p>随后会把这些信息上传到 init.icloud-analysis.com。如图所示：</p>

<p><img src="http://static.wooyun.org//drops/20150917/2015091709411338910.png" alt="enter image description here" /></p>

<p><code>http://init.icloud-analysis.com</code>并不是apple 的官方网站，而是病毒作者所申请的仿冒网站，用来收集数据信息的。</p>

<p><img src="http://static.wooyun.org//drops/20150917/2015091709411489731.png" alt="enter image description here" /></p>

<p>目前该网站的服务器已经关闭，用whois查询服务器信息也没有太多可以挖掘的地方。这说明病毒作者是个老手，并且非常小心，在代码和服务器上都没有留下什么痕迹，所以不排除以后还会继续做作案的可能。</p>

<h1>0x02 检测方法</h1>

<hr />

<p>为了防止app被插入恶意库文件，开发者除了检测”<code>/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs</code>” 目录下是否有可疑的<code>framework</code>文件之外，还应该检测一下<code>Target-&gt;Build Setting-&gt;Search Paths-&gt;Framework Search Paths</code>中的设置。看看是否有可疑的<code>frameworks</code>混杂其中：</p>

<p><img src="http://static.wooyun.org//drops/20150917/2015091709411423967.png" alt="enter image description here" /></p>

<p>另外因为最近iOS dylib病毒也十分泛滥，为了防止开发者中招，支付宝的小伙伴还提供了一个防止被dylib hook的小技巧：在Build Settings中找到“<code>Other Linker Flags</code>”在其中加上”<code>-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null</code>”即可。</p>

<p><img src="http://static.wooyun.org//drops/20150917/2015091709411432714.png" alt="enter image description here" /></p>

<p>最后的建议是：以后下载XCode编译器尽可能使用官方渠道，以免app被打包进恶意的病毒库。如果非要用非官方渠道，一定要在下载后校验一下哈希值。</p>

<h1>0x03 思考&amp;总结</h1>

<hr />

<p>虽然XCodeGhost并没有非常严重的恶意行为，但是这种病毒传播方式在iOS上还是首次。也许这只是病毒作者试试水而已，可能随后还会有更大的动作，请开发者务必要小心。这个病毒让我想到了UNIX 之父 Ken Thompson 的图灵奖演讲 “<code>Reflections of Trusting Trust</code>”。他曾经假设可以实现了一个修改的 tcc，用它编译 su login 能产生后门，用修改的tcc编译“正版”的 tcc 代码也能够产生有着同样后门的 tcc。也就是不论 <code>bootstrap</code> (用 tcc 编译 tcc) 多少次，不论如何查看源码都无法发现后门，真是细思恐极啊。</p>

<h1>0x04 追加更新</h1>

<hr />

<p>1 很多开发者们担心最近下载的Xcode 7也不安全。这里笔者没有使用任何下载工具的情况在苹果官网上下载了Xcode_7.dmg并计算了sha1的值。</p>

<pre><code>http://adcdownload.apple.com/Developer_Tools/Xcode_7/Xcode_7.dmg
$ shasum Xcode_7.dmg
4afc067e5fc9266413c157167a123c8cdfdfb15e  Xcode_7.dmg
</code></pre>

<p><img src="http://static.wooyun.org//drops/20150917/2015091718053535661.png" alt="enter image description here" /></p>

<p>所以如果在非App Store下载的各位开发者们可以用shasum校验一下自己下载的Xcode 7是否是原版。</p>

<p>2 @FlowerCode同学通过分析流量发现病毒开发者的服务器是搭建在Amazon EC2的云上的。服务器已经关闭 。</p>

<p><img src="http://static.wooyun.org//drops/20150917/2015091718053546275.png" alt="enter image description here" /></p>

<p>3 根据palo alto networks公司爆料，被感染的知名App Store应用为”网易云音乐”！该app应用在AppStore上的最新版本2.8.3已经确认被感染。并且该应用的Xcode编译版本为6.4（6E35b），也就是XcodeGhost病毒所感染的那个版本。网易云音乐在AppStore上目前的状态：</p>

<p><img alt="enter image description here" src="http://static.wooyun.org//drops/20150918/2015091802455969853.png" height="200" width="300"></p>

<p><img alt="enter image description here" src="http://static.wooyun.org//drops/20150918/2015091802502795111.png" height="200" width="300"></p>

<p>"网易云音乐"逆向后的函数列表，可以找到XcodeGhost所插入的函数：</p>

<p><img src="http://static.wooyun.org//drops/20150918/2015091802460165374.png" alt="enter image description here" /></p>

<p>受感染的"网易云音乐"app会把手机隐私信息发送到病毒作者的服务器”init.icloud-analysis.com”上面：</p>

<p><img src="http://static.wooyun.org//drops/20150918/2015091802460199903.png" alt="enter image description here" /></p>

<p>4 根据热心网友举报，投毒者网名为”coderfun”。他在各种iOS开发者论坛或者weibo后留言引诱iOS开发者下载有毒版本的Xcode。并且中毒的版本不止Xcode 6.4，还有6.1，6.2和6.3等等。</p>

<p><img src="http://static.wooyun.org//drops/20150918/2015091806281292667.jpg" alt="enter image description here" /></p>

<p><img src="http://static.wooyun.org//drops/20150918/2015091806281529651.jpg" alt="enter image description here" /></p>

<p><img alt="enter image description here" src="http://static.wooyun.org//drops/20150918/2015091806282019630.jpg" height="200" width="300"></p>

<p>5 根据热心网友提醒，我们在中信银行信用卡的应用”动卡空间”中也发现了被插入的XcodeGhost恶意代码，受感染的版本为3.4.4。</p>

<p><img alt="enter image description here" src="http://static.wooyun.org//drops/20150918/2015091806283265393.png" height="200" width="300"></p>

<p><img alt="enter image description here" src="http://static.wooyun.org//drops/20150918/2015091806290111499.png" height="200" width="300"></p>

<p>被插入的部分恶意代码如下：</p>

<p><img src="http://static.wooyun.org//drops/20150918/2015091806290736196.png" alt="enter image description here" /></p>

<p>6 在<code>@Saic</code>的提示下我们发现受感染的app还拥有接收黑客在云端的命令并按照黑客的指令发送URLScheme的能力：</p>

<p><img src="http://static.wooyun.org/drops/20150918/2015091816541654675bimage1.png" alt="enter image description here" /></p>

<p>URLScheme是iOS系统中为了方便app之间互相调用而设计的。你可以通过一个类似URL的链接，通过系统的Openurl来打开另一个应用，并可以传递一些参数。一个恶意的app通过发送URLScheme能干什么呢？</p>

<pre><code>&lt;1&gt;. 可以和safari进行通讯打开钓鱼网站。
&lt;2&gt;. 可以和AppStore进行通讯诱导用户下载其他AppStore应用。
&lt;3&gt;. 可以和itms-services服务通讯诱导用户下载无需AppStore审核的企业应用。
&lt;4&gt;. 向支付平台通讯发送欺骗性的支付请求等。
</code></pre>

<p>7 目前已经官方确认中毒的app有：微信，网易云音乐，豌豆荚的开眼等。</p>

<p><img src="http://static.wooyun.org/drops/20150918/2015091816543791064bimage2.png" alt="enter image description here" /></p>

<p><img src="http://static.wooyun.org/drops/20150918/2015091816544152084bimage3.jpeg" alt="enter image description here" /></p>

<p><img src="http://static.wooyun.org/drops/20150918/2015091816544474965bimage4.png" alt="enter image description here" /></p>

<h1>0x05 病毒作者现身</h1>

<hr />

<p>微博地址：http://weibo.com/u/5704632164</p>

<p><img src="http://static.wooyun.org/drops/20150919/2015091902032699290zuozhe.jpg" alt="enter image description here" /></p>

<p>发表长微博内容：</p>

<blockquote>
  <p>"XcodeGhost" Source 关于所谓”XcodeGhost”的澄清</p>
  
  <p>首先，我为XcodeGhost事件给大家带来的困惑致歉。XcodeGhost源于我自己的实验，没有任何威胁性行为，详情见源代码:https://github.com/XcodeGhostSource/XcodeGhost</p>
  
  <p>所谓的XcodeGhost实际是苦逼iOS开发者的一次意外发现：修改Xcode编译配置文本可以加载指定的代码文件，于是我写下上述附件中的代码去尝试，并上传到自己的网盘中。</p>
  
  <p>在代码中获取的全部数据实际为基本的app信息：应用名、应用版本号、系统版本号、语言、国家名、开发者符号、app安装时间、设备名称、设备类型。除此之外，没有获取任何其他数据。需要郑重说明的是：出于私心，我在代码加入了广告功能，希望将来可以推广自己的应用（有心人可以比对附件源代码做校验）。但实际上，从开始到最终关闭服务器，我并未使用过广告功能。而在10天前，我已主动关闭服务器，并删除所有数据，更不会对任何人有任何影响。</p>
  
  <p>愿谣言止于真相，所谓的"XcodeGhost"，以前是一次错误的实验，以后只是彻底死亡的代码而已。</p>
  
  <p>需要强调的是，XcodeGhost不会影响任何App的使用，更不会获取隐私数据，仅仅是一段已经死亡的代码。</p>
  
  <p>再次真诚的致歉，愿大家周末愉快</p>
</blockquote>      </p>
    
			</body>
		</html>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          